home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / DEMOS / FLC-BUMP.ZIP / BUMP.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1996-06-13  |  2.4 KB  |  112 lines

  1. type nimage = Array[0..65534] of Byte;
  2.  
  3. Var
  4. i,j,coul1,coul2  : integer;
  5. map              : ^nimage;
  6. c                : pointer;
  7. f                : file;
  8. nx,ny,coul       : integer;
  9. lx,ly,cx,cy,di   : integer;
  10.  
  11.  
  12. Function MouseGetPosX: Word; ASSEMBLER;
  13. ASM
  14. MOV AX,0003H
  15. INT 33H
  16. MOV AX,CX
  17. END;
  18.  
  19. Function MouseGetPosY :Word; ASSEMBLER;
  20. ASM
  21. MOV AX,0003H
  22. INT 33H
  23. MOV AX,DX
  24. END;
  25.  
  26. Function MouseLeft : BOOLEAN; ASSEMBLER;
  27. ASM
  28. MOV AX,0003H
  29. INT 33H
  30. AND BX,1
  31. MOV AX,BX
  32. END;
  33.  
  34. Begin
  35. { Initialisation des deux pointeurs : source et destination }
  36. c:=ptr($a000,0);
  37. New(map);
  38.  
  39. { Passage en mode graphique, et activation de la palette}
  40. asm
  41. mov ax,13h
  42. int 10h
  43. end;
  44. port[$3C8]:=0;
  45. for i:=0 to 767 do port[$3C9]:=i div 12;
  46.  
  47. {Lecture du fichier, au format brut 320*200*256 niveaux de gris}
  48. assign(f,'bump.img');
  49. reset(f,1);
  50. blockread(f,map^,64000);
  51. close(f);
  52.  
  53.  
  54. repeat
  55. {On recupere dans (cx,cy) les coordonnées du centre de lumière}
  56. cx:=mousegetposx div 2; cy:=mousegetposy;
  57.  
  58. {on commence le calcul de l'image en 321 = 1*320+1 :
  59.  c'est l'ofs de la position (1,1) }
  60. di:=321;
  61. {ly va nous permettre de connaitre la composante Y de la lumière}
  62. ly:=1-cy;
  63. for i:=1 to 198 do
  64.   begin
  65.   {pareil pour lx}
  66.   lx:=1-cx;
  67.   for j:=1 to 318 do
  68.     begin
  69.    {On commence par calculer nx : composantes X de la normale au point}
  70.     nx:=map^[di+1]-map^[di-1];
  71.  
  72.    {De la, on sait que si x et lx sont proches, le point est lumineux
  73.     On va donc regarder la difference entre les deux, et en prendre la
  74.     valeur absolue. On soustrait ensuite cette valeur à 128 :
  75.     cela donnera l'intensite de la couleur}
  76.     coul1:=127-abs(nx-lx);
  77.  
  78.    {De plus, il faut que la couleur soit comprise entre 0 et 128}
  79.     if coul1<0 then coul1:=0;
  80.  
  81.  
  82.    {On effectue les memes traitements sur y}
  83.     ny:=map^[di+320]-map^[di-320];
  84.     coul2:=127-abs(ny-ly);
  85.     if coul2<0 then coul2:=0;
  86.  
  87.    {On peut maintenant combiner coul1 et coul2, avec une pauvre multiplication}
  88.     coul:=coul1*coul2 div 64;
  89.  
  90.    {Et pouf, on prune la video}
  91.     mem[$A000:di]:=coul;
  92.     inc(di);
  93.    {et apres chaque pixel, on incremente lx, pour indiquer que la composante
  94.     X de la lumiere change}
  95.     inc (lx);
  96.     end;
  97.   {Comme la resolution n'est que du 318*198, apres chaque ligne, on ajoute
  98.    2 a DI}
  99.   di:=di+2;
  100.   inc(ly);
  101.  end;
  102.  
  103. until mouseleft;
  104.  
  105. {On repasse en mode texte}
  106. asm
  107. mov ax,3h
  108. int 10h
  109. end;
  110.  
  111. End.
  112.